
   function cc() {
       for (let i = 0; i <10; i++) {
           setTimeout(function() {
               console.log(i);
           }, 0);
       }

   }

   var jije= {}



   // let a =10;
   // let b = 1;
   // console.log(a+b);
   //
   // for (let i =0;i<10;i++){
   //     let i = "abc";
   //     console.log(i);
   // }
   //暂时性死区
   // if (true){
   //     tmp = 'abc';
   //     console.log(tmp);
   //
   //     let tmp;
   //     console.log(tmp);
   //
   //     tmp = 123;
   //     console.log(tmp);
   // }
   // function bar(x = y,y=2) {
   //     return [x,y];
   // }
   // bar();

   //var内部变量名称跟外部变量名称相同，原因在于变量提升，导致内层的tmp变量覆盖了外层的tmp变量。出现意想不到的结果
   // var tmp = new Date();
   //
   // function f() {
   //     console.log(tmp);
   //     if (false) {
   //         var tmp = 'hello world';
   //     }
   // }
   // f(); // undefined
   //
   // //let 新增块级作用域，不会导致变量提升
   // function f1() {
   //     let n = 5;
   //     if (true) {
   //         let n = 10;
   //     }
   //     console.log(n); // 5
   // }
   // f1();

   //因为有块级作用域的概念，所以会报错
   // {{{{
   //     {let insane = 'Hello World'}
   //     console.log(insane); // 报错
   // }}}};

   //报错
   // function f() { console.log('I am outside!'); }
   //
   // (function () {
   //     if (false) {
   //         // 重复声明一次函数f
   //         function f() { console.log('I am inside!'); }
   //     }
   //
   //     f();
   // }());

   //const  常量
   // const PI = 3.1415;
   // PI // 3.1415
   //
   // PI = 3;

   //报错
   // if (true) {
   //     const MAX = 5;
   // }
   //
   // console.log(MAX);

   //只声明不赋值 报错
   // const foo;

   //const不会变量提升，存在暂时性死区-》在声明后才能使用  报错
   // if (true) {
   //     console.log(MAX); // ReferenceError
   //     const MAX = 5;
   // }

    //const声明的常量，也与let一样不可重复声明。  报错
   // var message = "Hello!";
   // let age = 25;
   //
   // // 以下两行都会报错
   // const message = "Goodbye!";
   // const age = 30;

   // 总结：
   // 1、let没有变量提升，var有
   // 2、let存在暂时性死区，也就是在没有声明此变量之前是不可以使用的
   // 3、let变量名不可以重复声明
   // 4、let有块级作用域的概念，用{}来区分块级，不同作用于内的变量可以重名
   // {
   //     let a =10;
   //     {
   //         let a = 5;
   //         console.log(a);
   //     }
   //     console.log(a);
   // }
   // 5、const只声明不赋值 报错
   // 6、const不会变量提升，存在暂时性死区-》在声明后才能使用  报错
   // 7、const声明的常量，也与let一样不可重复声明。  报错


   //变量和解构赋值
   //从左到右依次对应
   // let [a,b,c] = [1,2,3]
   // console.log("a:"+a+"  b:"+b+"  c:"+c);

   //根据两侧的下标来取值
   // let [a,,b,c] = [1,2,3]
   // console.log("a:"+a+"  b:"+b+"  c:"+c);

    //第一个变量取第一个，最后一个变量取余下的
   // let [a,...b] = [1,2,3]
   // console.log("a:"+a+"  b:"+b);

   //第一个变量取第一个
   // let [a,b,...c] = [5]
   // console.log("a:"+a+"  b:"+b+"   c:"+c);


   //数组的格式要对应，左侧数组，右侧也必须是数组
   //let [foo] = 1;
   // let [foo] = false;
   // let [foo] = NaN;
   // let [foo] = undefined;
   // let [foo] = null;
   // let [foo] = {};

   // let [x, y, z] = new Set(['a', 'b', 'c']);
   // console.log("x:"+x+"  y:"+y+"   z:"+z);

  //  function* f() {
  //      for(var i = 0; true; i++) {
  //          var reset = yield i;
  //          if(reset) { i = -1; }
  //      }
  //  }
  //  var g = f();
  //
  // console.log( g.next()) // { value: 0, done: false }
  // console.log( g.next()) // { value: 0, done: false }
  // console.log( g.next(true)) // { value: 0, done: false }



   // function* numbers() {
   //     console.log('function start.');
   //
   //     var v1 = yield 0;
   //     console.log('v1 = ' + v1);
   //
   //     var v2 = yield 1;
   //     console.log('v2 = ' + v2);
   //
   //     return 5;
   // }
   //
   // var nums = numbers();
   // console.log(nums.next());
   // console.log(nums.next());
   // console.log(nums.next());
   // console.log(nums.next());



   // function* countAppleSales () {
   //     var saleList = [3, 7, 5];
   //     for (var i = 0; i < saleList.length; i++) {
   //         let a =  yield saleList[i];
   //         console.log("for->"+a)
   //     }
   // }
   // //第一步，获取countAppleSales实例
   // var appleStore = countAppleSales(); // Generator { }
   // //第一次调用next，执行 let a =  yield saleList[i];后，不往下走了，处于暂停状态
   // console.log(appleStore.next()); // { value: 3, done: false }
   // //第二次调用next,先执行上一次暂停后的代码，如果next不传参数的话，同上。如果传参，会将next后的参数赋值给yield，再往后执行，
   // console.log(appleStore.next(1000)); // { value: 7, done: false }
   // console.log(appleStore.next(2000)); // { value: 5, done: false }
   // console.log(appleStore.next()); // { value: undefined, done: true }
   //测试提交

   function f() {
       console.log('aaa');
   }

   let [x = f()] = [1];